package com.ling;

/**
 * 非空判断 Preconditions.checkNotNull(param,"xx")
 * xx 为自定义报错
 */
public class NPECheck {
    public static void main(String[] args) {
        //================ 判断 ======================

         // 非空判断
//         String param = "代码";
//         String name = Preconditions.checkNotNull(param);
//         System.out.println(name);
//         String param2 = null;
//         String name2 = Preconditions.checkNotNull(param2,"param2 is null");
//         System.out.println(name2);
        //  预期值判断
//        String param = "www.wdbyte.com2";
//        String wdbyte = "www.wdbyte.com";
//        Preconditions.checkArgument(wdbyte.equals(param), "[%s] 404 NOT FOUND", param);

        // 数组越界
        // Guava 中快速创建ArrayList
//        List<String> list = Lists.newArrayList("a", "b", "c", "d");
//        Preconditions.checkElementIndex(5,list.size());



        //================ 集合 ======================

        // 不可变集合
        /**
         *
         * 优势
         *        1.线程安全，因为不能修改任何元素，可以随意多线程使用且没有并发问题。
         *        2.可以无忧的提供给第三方使用，反正修改不了。
         *        3.减少内存占用，因为不能改变，所以内部实现可以最大程度节约内存占用。
         *        4.可以用作常量集合。
         *
         * 三种：
         *      of / builder / copyOf
         *
         *  Tip:
         *      1.不能进行增删改，否则会报 UnsupportedOperationException
         *      2.元素不能为null
         */


        // of
//        ImmutableSet<String> immutableSet  = ImmutableSet.of("a", "b", "c");
//        immutableSet.forEach(System.out::println);
//
//        //a
//        //b
//        //c
//
//        // builder
//        ImmutableSet<String> immutableSet2 = ImmutableSet.<String>builder()
//                .add("hello")
//                .add(new String("未读代码"))
//                .build();
//        immutableSet2.forEach(System.out::println);
//        //hello
//        //未读代码
//
//        //copyOf
//        List<String> list = new ArrayList<>();
//        list.add("www.xxx.com");
//        list.add("https");
//        ImmutableSet<String> immutableSet3 = ImmutableSet.copyOf(list);
//        immutableSet3.forEach(System.out::println);
//
//        //Java 自带不可变集合
//        ArrayList<String> arryList = new ArrayList<>();
//        arryList.add("www.xxx.cn");
//        arryList.add("http");
//        List<String> lists = Collections.unmodifiableList(arryList);
//        lists.forEach(System.out::println);
//        list.add("未读代码");
//
//        // java -- guava 对比 原集合添加后显示对比
//        List<String> arrayList = new ArrayList<>();
//        arrayList.add("a");
//        arrayList.add("b");
//        List<String> jdkList = Collections.unmodifiableList(arrayList);
//        ImmutableList<String> immutableList = ImmutableList.copyOf(arrayList);
//        arrayList.add("ccc");
//        System.out.println("---java---");
//        jdkList.forEach(System.out::println);// result: a b ccc
//        System.out.println("---guava----");
//        immutableList.forEach(System.out::println);// result: a b

        //创建集合 -- 便捷体验 不需要再使用   add 添加元素了
//        List<String> list1 = Lists.newArrayList();
//        List<String> list2 = Lists.newArrayList("a", "b", "c");
//        List<String> list3 = Lists.newArrayListWithCapacity(10);
//
//        LinkedList<String> linkedList1 = Lists.newLinkedList();
//        CopyOnWriteArrayList<String> cowArrayList = Lists.newCopyOnWriteArrayList();
//
//        HashMap<Object, Object> map = Maps.newHashMap();
//        ConcurrentMap<Object, Object> concuMap = Maps.newConcurrentMap();
//        TreeMap<Comparable, Object> treeMap = Maps.newTreeMap();
//        HashSet<Object> hashSet = Sets.newHashSet();
//        HashSet<String> newHashSet = Sets.newHashSet("a", "b", "c");

        // 交集并集差集
//        //intersection / union / difference
//        Set<String> newHashSet1 = Sets.newHashSet("a", "a", "b", "c");
//        Set<String> newHashSet2 = Sets.newHashSet("b", "b", "c", "d");
//
//        // 交集
//        Sets.SetView<String> intersection = Sets.intersection(newHashSet1, newHashSet2);
//        System.out.printf("[%s] 交集 ", intersection); // [b, c]
//
//        // 并集
//        Sets.SetView<String> union = Sets.union(newHashSet1, newHashSet2);
//        System.out.printf("[%s] 并集", intersection); // [a, b, c, d]
//        // 差集
//        Sets.SetView<String> difference = Sets.difference(newHashSet1, newHashSet2);
//        System.out.printf("[%s] 差集", difference);  // [a]
//
//        System.out.println();
//
//        //有数量的集合 HashMultiset/HashMultimap/
//        // Java 统计相同元素出现的次数。
//        List<String> words = Lists.newArrayList("a", "b", "c", "d", "a", "c");
//        Map<String, Integer> countMap = new HashMap<String, Integer>();
//        for (String word : words) {
//            Integer count = countMap.get(word);
//            count = (count == null) ? 1 : ++count;
//            countMap.put(word, count);
//        }
//        countMap.forEach((k, v) -> System.out.println(k + ":" + v));
//        // Guava 统计相同元素出现次数
//        ArrayList<String> arrayList = Lists.newArrayList("a", "b", "c", "d", "a", "c");
//        HashMultiset<String> multiset = HashMultiset.create(arrayList);
//        multiset.elementSet().forEach(s-> System.out.println(s+":" +multiset.count(s)));
//
//        // 分类
//        // java
//        HashMap<String, Set<String>> animalMap = new HashMap<>();
//        HashSet<String> dogSet = new HashSet<>();
//        dogSet.add("旺财");
//        dogSet.add("大黄");
//        animalMap.put("狗", dogSet);
//        HashSet<String> catSet = new HashSet<>();
//        catSet.add("加菲");
//        catSet.add("汤姆");
//        animalMap.put("猫", catSet);
//        System.out.println(animalMap.get("猫")); // [加菲, 汤姆]
//        //guava
//
//        HashMultimap<String,String> multimapAnimal = HashMultimap.create();
//        multimapAnimal.put("dog", "泰迪");
//        multimapAnimal.put("dog", "腊肠");
//        multimapAnimal.put("dog", "雪纳瑞");
//        multimapAnimal.put("cat", "加菲");
//        multimapAnimal.put("cat", "汤姆");
//        System.out.println("======guava=======");
//        System.out.println(multimapAnimal.get("cat"));


        //================ 字符串操作 ======================


        //字符串操作
        // JDK 方式一
//        ArrayList<String> list = Lists.newArrayList("a", "b", "c", null);
//        String join = String.join(",", list);
//        System.out.println(join); // a,b,c,null
//        // JDK 方式二
//        list.stream().collect(Collectors.joining(","));
//        String result = list.stream().collect(Collectors.joining(","));
//        System.out.println(result); // a,b,c,null
//        // JDK 方式三
//        StringJoiner stringJoiner = new StringJoiner(",");
//        list.forEach(stringJoiner::add);
//        System.out.println(stringJoiner.toString()); // a,b,c,null
        // guava
//        ArrayList<String> guava_list = Lists.newArrayList("a", "b", "c", null);
//        String join = Joiner.on(",").skipNulls().join(guava_list);
//        System.out.println(join); // a,b,c
//
//        String join1 = Joiner.on(",").useForNull("空值").join("旺财", "汤姆", "杰瑞", null);
//        System.out.println(join1); // 旺财,汤姆,杰瑞,空值


    }
}
